Option Explicit

' ======================================================================
' Public
' ======================================================================
' 创建一个 `IPrimitiveArrayRef` 的默认实现类 `PrimitiveArrayRef` 的对象，用来保存数组数据
'
' @return 一个 PrimitiveArrayRef 类型的对象
Public Function createRealPrimitiveArrayRef(Optional ByRef initSize As Variant = 10) As IPrimitiveArrayRef
    Dim result As PrimitiveArrayRef
    Set result = New PrimitiveArrayRef
    result.Init initSize

    Set createRealPrimitiveArrayRef = result
End Function

' 创建一个 `IObjArrayRef` 的默认实现类 `ObjArrayRef` 的对象，用来保存数组数据
'
' @return 一个 ObjArrayRef 类型的对象
Public Function createRealObjArrayRef(Optional ByRef initSize As Variant = 10) As IObjArrayRef
    Dim result As ObjArrayRef
    Set result = New ObjArrayRef
    result.Init initSize

    Set createRealObjArrayRef = result
End Function

' 将一个集合 `desc` 合并到集合 `src` 中，并且在每一行前附加前缀字符串 `prefixStr`
' @param src 保存合并结果的集合
' @param desc 被合并的集合
' @param prefixStr 合并时的前缀字符串
Public Sub mergeArrayRefWithPrefix(ByRef src As IPrimitiveArrayRef, ByRef desc As IPrimitiveArrayRef, ByRef prefixStr As String)
    Dim i As Long

    ' 如果前缀字符串是空字符串，则不需要附加前缀字符串，直接合并即可
    If prefixStr = "" Then
        src.mergeArrRef desc
    Else
        For i = 0 To desc.MaxIndex
            src.Add prefixStr & desc.Item(i)
        Next
    End If
End Sub

' 将一个对象包装为长度为 1 的数组引用
' @param val 需要包装的对象
' @return 长度为 1 的对象数组引用
Public Function wrapperToObjArrayRef(ByRef val As Variant) As IObjArrayRef
    ' 1. 创建一个长度为 1 的数组引用
    Dim temp As ObjArrayRef
    Set temp = New ObjArrayRef
    temp.Init 1

    Set wrapperToObjArrayRef = temp

    ' 2. 保存对象
    wrapperToObjArrayRef.Add val
End Function

' 将一个基础类型数据包装为长度为 1 的数组引用
' @param val 需要包装的对象
' @return 长度为 1 的基础数据类型的数组引用
Public Function wrapperToPrimitiveArrayRef(ByRef val As Variant) As IPrimitiveArrayRef
    ' 1. 创建一个长度为 1 的数组引用
    Dim temp As PrimitiveArrayRef
    Set temp = New PrimitiveArrayRef
    temp.Init 1

    Set wrapperToPrimitiveArrayRef = temp

    ' 2. 保存对象
    wrapperToPrimitiveArrayRef.Add val
End Function

' 将一个基础类型数据的数组引用连接成一个字符串
' @param arrRef 需要处理的基础数据类型的数组引用
' @param delimiter 用来连接的分隔符
' @return 连接后的字符串
Public Function reducePrimitiveArrayRefToStr(ByRef arrRef As IPrimitiveArrayRef, ByRef delimieter As String) As String
    ' 1. 检查参数
    ' 如果数组引用中没有元素，则退出
    If arrRef.MaxIndex < 0 Then
        ' return ""
        Exit Function
    End If

    ' 2. 连接第一行 （用来保证无论 delimieter 是什么值，都能正确处理）
    reducePrimitiveArrayRefToStr = reducePrimitiveArrayRefToStr & arrRef.Item(0)

    ' 3. 从第二行开始，到最后一行，遍历数组引用
    Dim i As Long
    For i = 1 To arrRef.MaxIndex
        reducePrimitiveArrayRefToStr = reducePrimitiveArrayRefToStr & delimieter & arrRef.Item(i)
    Next
End Function